/* Copyright (c) 2010,2011 Daniel Doubrovkine, All Rights Reserved
 * 
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 * 
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.  
 */
package com.jpexs.decompiler.flash.gui.player.jna.platform.win32;

import com.jpexs.decompiler.flash.gui.player.jna.platform.win32.WinNT.HRESULT;

// TODO: Auto-generated Javadoc
/**
 * Utility class for some common error functions.
 */
public abstract class W32Errors implements WinError {

   /**
    * Generic test for success on any status value (non-negative numbers
    * indicate success).
    *
    * @param hr the hr
    * @return true, if successful
    */
   public static final boolean SUCCEEDED(int hr) {
      return hr >= 0;
   }

   /**
    * and the inverse.
    *
    * @param hr the hr
    * @return true, if successful
    */
   public static final boolean FAILED(int hr) {
      return hr < 0;
   }

   /**
    * Succeeded.
    *
    * @param hr the hr
    * @return true, if successful
    */
   public static final boolean SUCCEEDED(HRESULT hr) {
      if (hr != null) {
         return SUCCEEDED(hr.intValue());
      } else {
         return false;
      }
   }

   /**
    * Failed.
    *
    * @param hr the hr
    * @return true, if successful
    */
   public static final boolean FAILED(HRESULT hr) {
      if (hr != null) {
         return FAILED(hr.intValue());
      } else {
         return false;
      }
   }

   /**
    * Extract error code from HRESULT.
    *
    * @param hr the hr
    * @return the int
    */
   public static final int HRESULT_CODE(int hr) {
      return hr & 0xFFFF;
   }

   /**
    * Extract error code from SCODE.
    *
    * @param sc the sc
    * @return the int
    */
   public static final int SCODE_CODE(int sc) {
      return sc & 0xFFFF;
   }

   /**
    * Return the facility.
    *
    * @param hr the hr
    * @return the int
    */
   public static final int HRESULT_FACILITY(int hr) {
      return (hr >>= 16) & 0x1fff;
   }

   /**
    * Scode facility.
    *
    * @param sc the sc
    * @return the int
    */
   public static final int SCODE_FACILITY(short sc) {
      return (sc >>= 16) & 0x1fff;
   }

   /**
    * Return the severity.
    *
    * @param hr the hr
    * @return the short
    */
   public static short HRESULT_SEVERITY(int hr) {
      return (short) ((hr >>= 31) & 0x1);
   }

   /**
    * Scode severity.
    *
    * @param sc the sc
    * @return the short
    */
   public static short SCODE_SEVERITY(short sc) {
      return (short) ((sc >>= 31) & 0x1);
   }

   /**
    * Create an HRESULT value from component pieces.
    *
    * @param sev the sev
    * @param fac the fac
    * @param code the code
    * @return the int
    */
   public static int MAKE_HRESULT(short sev, short fac, short code) {
      return ((sev << 31) | (fac << 16) | code);
   }

   /**
    * Make scode.
    *
    * @param sev the sev
    * @param fac the fac
    * @param code the code
    * @return the int
    */
   public static final int MAKE_SCODE(short sev, short fac, short code) {
      return ((sev << 31) | (fac << 16) | code);
   }

   /**
    * Map a WIN32 error value into a HRESULT Note: This assumes that WIN32
    * errors fall in the range -32k to=32k.
    *
    * @param x original w32 error code
    * @return the converted value
    */
   public static final HRESULT HRESULT_FROM_WIN32(int x) {
      int f = FACILITY_WIN32;
      return new HRESULT(x <= 0 ? x : ((x) & 0x0000FFFF) | (f <<= 16)
              | 0x80000000);
   }

   /**
    * FACILITY_USERMODE_FILTER_MANAGER
    *
    * Translation macro for converting: NTSTATUS --> HRESULT.
    *
    * @param x the x
    * @return the int
    */
   public static final int FILTER_HRESULT_FROM_FLT_NTSTATUS(int x) {
      int f = FACILITY_USERMODE_FILTER_MANAGER;
      return (((x) & 0x8000FFFF) | (f <<= 16));
   }
}
